package com.freightoa.foundation.app

import com.google.gson.Gson
import com.tencent.mmkv.MMKV

/**
 * 作者：lhgray on 2025/3/28.
 * 邮箱：lhgray@163.com
 * 文件：com.freightoa.foundation.app
 */
object MMKVUtils {
    private val mmkv: MMKV by lazy {
        MMKV.defaultMMKV()
    }

    private val gson: Gson by lazy {
        Gson()
    }

    // 存储 Int 类型数据
    fun putInt(key: String, value: Int) {
        mmkv.encode(key, value)
    }

    // 获取 Int 类型数据
    fun getInt(key: String, defaultValue: Int = 0): Int {
        return mmkv.decodeInt(key, defaultValue)
    }

    // 存储 Long 类型数据
    fun putLong(key: String, value: Long) {
        mmkv.encode(key, value)
    }

    // 获取 Long 类型数据
    fun getLong(key: String, defaultValue: Long = 0L): Long {
        return mmkv.decodeLong(key, defaultValue)
    }

    // 存储 Float 类型数据
    fun putFloat(key: String, value: Float) {
        mmkv.encode(key, value)
    }

    // 获取 Float 类型数据
    fun getFloat(key: String, defaultValue: Float = 0f): Float {
        return mmkv.decodeFloat(key, defaultValue)
    }

    // 存储 Boolean 类型数据
    fun putBoolean(key: String, value: Boolean) {
        mmkv.encode(key, value)
    }

    // 获取 Boolean 类型数据
    fun getBoolean(key: String, defaultValue: Boolean = false): Boolean {
        return mmkv.decodeBool(key, defaultValue)
    }

    // 存储 String 类型数据
    fun putString(key: String, value: String) {
        mmkv.encode(key, value)
    }

    // 获取 String 类型数据
    fun getString(key: String, defaultValue: String = ""): String {
        return mmkv.decodeString(key, defaultValue) ?: defaultValue
    }

    // 存储对象
    fun <T> putObject(key: String, obj: T) {
        val json = gson.toJson(obj)
        mmkv.encode(key, json)
    }

    // 获取对象
    private inline fun <reified T> getObject(key: String, defaultValue: T? = null): T? {
        val json = this.mmkv.decodeString(key, null)
        return if (json != null) {
            gson.fromJson(json, T::class.java)
        } else {
            defaultValue
        }
    }

    // 删除指定键的数据
    fun remove(key: String) {
        mmkv.removeValueForKey(key)
    }

    // 清空所有数据
    fun clearAll() {
        mmkv.clearAll()
    }
}